﻿using System;
using System.Data;
using System.Configuration;
using System.IO;
using System.Web;
using System.Web.Security;
using Com.Toook.Common;

namespace Com.Toook.Images
{
    /// <summary>
    ///Image 的摘要说明
    /// </summary>
    public class ImageHelper
    {
        public ImageHelper()
        {
        }
        /// <summary>
        /// 生成缩略图
        /// </summary>
        /// <param name="originalImagePath">源图路径（物理路径）</param>
        /// <param name="thumbnailPath">缩略图路径（物理路径）</param>       
        /// <param name="mode">生成缩略图的方式：Auto:自动调整宽高，保证最大一个不超过指定框值。比框小的保持原图大小不放大
        /// AutoFixed:自动调整宽高。比框小的放大原图到指定大小。
        /// HW 指定高宽缩放（可能变形）、W 指定宽，高按比例、H 指定高，宽按比例、Cut 指定高宽裁减（不变形）</param>
        /// <param name="width">缩略图宽度</param>
        /// <param name="height">缩略图高度</param>
        public static void MakeThumbnail(string originalImagePath, string thumbnailPath, string mode, int width, int height)
        {
            string tempFilePath = "";

            //如果源图和缩略图的路径一样，拷贝原图在文件名前加上“temp”
            if (originalImagePath == thumbnailPath)
            {
                tempFilePath = originalImagePath.Substring(0, originalImagePath.LastIndexOf('\\') + 1) + 
                    "temp_" + originalImagePath.Substring(originalImagePath.LastIndexOf('\\') + 1);
                File.Copy(originalImagePath, tempFilePath, true);
                File.Delete(originalImagePath);
                originalImagePath = tempFilePath;
            }
            //生成来源Image对象
            System.Drawing.Image originalImage = null;
            try
            {
                originalImage = System.Drawing.Image.FromFile(originalImagePath);
            }
            catch(Exception ex)
            {
                if(originalImage != null)
                {
                    try
                    {
                        originalImage.Dispose();
                    }
                    catch(Exception de)
                    {
                        LogHelper.Log.Error("释放图片失败：" + originalImagePath, de);
                    }
                }
                LogHelper.Log.Error("读取图片失败：" + originalImagePath, ex);
                return;
            }
            int toWidth = width;
            int toHeight = height;

            int x = 0;
            int y = 0;
            int ow = originalImage.Width;
            int oh = originalImage.Height;            

            switch (mode)
            {
                case "HW":  //指定高宽缩放（可能变形）
                    break;
                case "W":  //指定宽，高按比例
                    toHeight = originalImage.Height * width / originalImage.Width;
                    break;
                case "H":  //指定高，宽按比例
                    toWidth = originalImage.Width * height / originalImage.Height;
                    break;
                case "Auto":  //自动按比例缩放，以宽高中大的值为准
                    if(ow <= width && oh <= height)//如果原始图片比指定小，直接拷贝原始图片
                    {
                        File.Copy(originalImagePath, thumbnailPath, true);
                        originalImage.Dispose();

                        return;
                    }
                    if (originalImage.Width >= originalImage.Height)
                    {
                        toHeight = originalImage.Height * width / originalImage.Width;
                    }
                    else
                    {
                        toWidth = originalImage.Width * height / originalImage.Height;
                    }
                    break;
                case "AutoFixed":  //自动按比例缩放，如果原图比指定框小，放大原图。                  
                    if(originalImage.Width >= originalImage.Height)
                    {
                        toHeight = originalImage.Height * width / originalImage.Width;
                    }
                    else
                    {
                        toWidth = originalImage.Width * height / originalImage.Height;
                    }
                    break;
                case "Cut"://指定高宽裁减（不变形）
                    if ((double)originalImage.Width / (double)originalImage.Height > (double)toWidth / (double)toHeight)
                    {
                        oh = originalImage.Height;
                        ow = originalImage.Height * toWidth / toHeight;
                        y = 0;
                        x = (originalImage.Width - ow) / 2;
                    }
                    else
                    {
                        ow = originalImage.Width;
                        oh = originalImage.Width * height / toWidth;
                        x = 0;
                        y = (originalImage.Height - oh) / 2;
                    }
                    break;
                default:
                    break;
            }

            //新建一个bmp图片
            System.Drawing.Image bitmap = new System.Drawing.Bitmap(toWidth, toHeight);

            //新建一个画板
            System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap);

            //设置高质量插值法
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;

            //设置高质量,低速度呈现平滑程度
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

            //清空画布并以透明背景色填充
            g.Clear(System.Drawing.Color.Transparent);

            //在指定位置并且按指定大小绘制原图片的指定部分
            g.DrawImage(originalImage, 
                new System.Drawing.Rectangle(0, 0, toWidth, toHeight),//目标矩形
                new System.Drawing.Rectangle(x, y, ow, oh),//源矩形
                System.Drawing.GraphicsUnit.Pixel);

            try
            {
                //以jpg格式保存缩略图
                bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Jpeg);
            }
            catch (System.Exception e)
            {
                throw e;
            }
            finally
            {
                originalImage.Dispose();
                bitmap.Dispose();
                g.Dispose();
            }

            if (tempFilePath != "")//如果在同一个目录里面，删除临时图片
            {
                File.Delete(tempFilePath);
            }
        }

        /// <summary>
        /// 在图片上增加文字水印
        /// </summary>
        /// <param name="Path">原服务器图片路径</param>
        /// <param name="Path_sy">生成的带文字水印的图片路径</param>
        public static void AddShuiYinWord(string Path, string Path_sy, string addText, float x, float y)
        {
            System.Drawing.Image image = System.Drawing.Image.FromFile(Path);
            System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(image);
            g.DrawImage(image, 0, 0, image.Width, image.Height);
            System.Drawing.Font f = new System.Drawing.Font("Verdana", 16);
            System.Drawing.Brush b = new System.Drawing.SolidBrush(System.Drawing.Color.Blue);

            g.DrawString(addText, f, b, x, y);
            g.Dispose();

            image.Save(Path_sy);
            image.Dispose();
        }

        /// <summary>
        /// 在图片上生成图片水印
        /// </summary>
        /// <param name="Path">原服务器图片路径</param>
        /// <param name="Path_syp">生成的带图片水印的图片路径</param>
        /// <param name="Path_sypf">水印图片路径</param>
        public static void AddShuiYinPic(string Path, string Path_syp, string Path_sypf)
        {
            System.Drawing.Image image = System.Drawing.Image.FromFile(Path);
            System.Drawing.Image copyImage = System.Drawing.Image.FromFile(Path_sypf);
            System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(image);
            g.DrawImage(copyImage, new System.Drawing.Rectangle(image.Width - copyImage.Width, image.Height - copyImage.Height, copyImage.Width, copyImage.Height), 0, 0, copyImage.Width, copyImage.Height, System.Drawing.GraphicsUnit.Pixel);
            g.Dispose();

            image.Save(Path_syp);
            image.Dispose();
        }
    }
}